package com.leemz.design.chapter5.doublecheck;

/**
 * 基于双重检查确保线程安全的单例模式
 */
public class DoubleCheckSingleton {

    private static volatile DoubleCheckSingleton singleton;

    private DoubleCheckSingleton() {}

    /**
     * 基于双重机制的同步措施，只有在第一次创建实例时才会进行真正的同步
     * 而后续的获取单例对象则无需同步，相比直接在方法上使用同步关键字的性能要更好
     * @return
     */
    public static DoubleCheckSingleton getInstance() {
        if(null == singleton) {
            synchronized (DoubleCheckSingleton.class) {
                if(null == singleton) {
                    singleton = new DoubleCheckSingleton();
                }
            }
        }
        return singleton;
    }
}
